package org.example.myframework.frame.common.web.trace;

import org.slf4j.MDC;

import java.util.UUID;

/**
 * 链路追踪上下文
 */
public class TraceIdContext {

    /**
     * ThreadLocal:值不能够在线程中传递。
     * InheritableThreadLocal：在创建子线程时，会自动继承父线程中的值
     *      在项目中进行链路请求的时候，整个id都可以拿到
     */
    public static final ThreadLocal<String> CURRENT_TRACE_ID = new InheritableThreadLocal<>();

    /**
     * 生成traceId
     * @return
     */
    public static String generateTraceID() {
        return UUID.randomUUID().toString();
    }

    public static String getTraceID() {
        return MDC.get(TraceIdConstant.TRACE_ID);
    }

    public static void setTraceID(String traceID) {
        MDC.put(TraceIdConstant.TRACE_ID, traceID);
    }

    public static void clearTraceID() {
        CURRENT_TRACE_ID.set(null);
        CURRENT_TRACE_ID.remove();
    }
}
